home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 326-350 / disk_332 / k1_editor / k1_editor_e.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  56KB  |  1,859 lines

  1. #define INTUITIONPRIVATE 1
  2. #include <exec/exec.h>
  3. #include <intuition/intuitionbase.h>
  4. #include <functions.h>
  5. #include <libraries/dosextens.h>
  6. #include <graphics/gfxbase.h>
  7. #include <intuition/preferences.h>
  8. #include <libraries/reqbase.h>
  9. #include <workbench/workbench.h>
  10. #include <workbench/startup.h>
  11. #include <workbench/icon.h>
  12. #include <midi/kawai_k1.h>
  13.  
  14. #include "K1_Window_E.c"
  15.  
  16. #define WAVETEST    (MenuItem2.Flags & CHECKED) == CHECKED
  17. #define AUTOWRITE    (MenuItem1.Flags & CHECKED) == CHECKED
  18. #define COMMON        (Gadget29.Flags & SELECTED) == SELECTED
  19. #define FREQUENCY    (Gadget30.Flags & SELECTED) == SELECTED
  20. #define WAVEFORM    (Gadget31.Flags & SELECTED) == SELECTED
  21. #define ENVELOPE    (Gadget32.Flags & SELECTED) == SELECTED
  22. #define VOICE1        ((Gadget33.Flags & SELECTED) == SELECTED)
  23. #define VOICE2        ((Gadget36.Flags & SELECTED) == SELECTED)
  24. #define VOICE3        ((Gadget34.Flags & SELECTED) == SELECTED)
  25. #define VOICE4        ((Gadget35.Flags & SELECTED) == SELECTED)
  26. #define SCARD        ((Gadget38.Flags & SELECTED) == SELECTED)
  27. #define DCARD        ((Gadget37.Flags & SELECTED) == SELECTED)
  28. /* für die Form: if(WAVETEST) {...} */
  29.  
  30. #define SWCOM        (1L << wcom->UserPort->mp_SigBit)
  31. #define SWWAV        (1L << wwav->UserPort->mp_SigBit)
  32. #define SWFRQ        (1L << wfrq->UserPort->mp_SigBit)
  33. #define SWENV        (1L << wenv->UserPort->mp_SigBit)
  34. #define SWSPC        ((wspc) ? (1L << wspc->UserPort->mp_SigBit) : 0)
  35. #define SMIDI        (1L << dest->DestPort->mp_SigBit)
  36. /* für die Hauptschleife */
  37.  
  38. #define ACTSOUND    SoundData[iebase*64+actual]
  39. #define SOURCE        (SCARD*64+(int)(Gadget26SInfo.HorizPot / Gadget26SInfo.HorizBody))
  40. #define DESTIN        (DCARD*64+(int)(Gadget27SInfo.HorizPot / Gadget27SInfo.HorizBody))
  41. #define PERCENT        (Gadget28SInfo.HorizPot / 65535.0)
  42. #define MIX(A,B)    (int)(fas*(A) + fad*(B))
  43. #define MIN(A,B)    (((A)<(B)) ? (A) : (B))
  44. #define MAX(A,B)    (((A)>(B)) ? (A) : (B))
  45.  
  46. #define DS11        ACTSOUND[11]
  47. #define DS17        ACTSOUND[17]
  48. #define DS22        ACTSOUND[22]
  49. #define DS35        ACTSOUND[35+envVoice]
  50. /* für die Bitfeldzugriffe */
  51.  
  52. #define SSWAP(N)    z=a[N]; a[N]=b[N]; b[N]=z
  53. /* für die SpecialExchange */
  54.  
  55. int
  56. BoZa[6],
  57. FrqProps[3] =                /* Frequenz-TextProps (Param.) */
  58. { 27,23,83 },
  59. PropOffset[29] =            /* Anzeige-Offsets */
  60. {    0,1,1,-50,0, 1,1,1,1, -24,-50,-50,-24,-50,-50,-24,-50,-50,-24,-50,-50,
  61.     -50,-50,-50,-50,-50, 1,1,0
  62. },
  63. EnvProp[11][2] =            /* ENV-Gadgets --> Param. */
  64. {    57,43, 58,59, 59,55, 60,51, 61,47, 62,39,
  65.     21,67, 22,71, 23,63, 24,75, 25,79
  66. },
  67. GrafProp[13] =                /* Gadgets 50..62 --> Param. */
  68. {    21,20,19,18, 14,16,13, 43,59,55,51,47,39
  69. },
  70. TextProp[29] =                /* Gadgets 1..28 --> Param. */
  71. {    0, 0,10,12,15, 0,0,0,0, 27,23,83, 28,24,84, 29,25,85, 30,26,86,
  72.     67,71,63,75,79, 0,0,0
  73. },
  74. RangeMax[22] =                /* max. Werte der s0..s21 Parameter */
  75. {    0,0,0,0,0,0,0,0,0,0,99,0,100,100,100,12,100,0,100,100,100,100
  76. };
  77.  
  78. char
  79. *BoTe[6][5] =                /* BOOLtexte zum durchschalten */
  80. {    "POLY 1","POLY 2"," SOLO ",0,0,
  81.     "2","4",0,0,0,
  82.     "-|-","-->","<--",0,0,
  83.     "-|-","-->","<--",0,0,
  84.     "Single","Multi ",0,0,0,
  85.     "INT","int","EXT","ext",0
  86. },
  87. *PrTe[29] =                    /* PROPtexte zum formatieren */
  88. {    0,0,"Volume=%3d","Prs } Freq:%3d","Pitch Wheel:%2d",
  89.     0,0,0,0,
  90.     0,"Freq Fine   = %3d","KS } Freq   = %3d",
  91.     0,"Freq Fine   = %3d","KS } Freq   = %3d",
  92.     0,"Freq Fine   = %3d","KS } Freq   = %3d",
  93.     0,"Freq Fine   = %3d","KS } Freq   = %3d",
  94.     "Prs } EnvLevel %3d","KS  } EnvLevel %3d","VC } EnvLevl %3d",
  95.     "VC } EnvTime %3d","KS } EnvTime %3d",
  96.     0,0,0
  97. },
  98. *ToneName[12] =
  99. {    "C ","C#","D ","D#","E ","F ","F#","G ","G#","A ","B ","H "
  100. },
  101. *WaveName[256] =
  102. {    "Sine 1st","Sine 2nd","Sine 3rd","Sine 4th","Sine 5th","Sine 6th","Sine 7th",
  103.     "Sine 8th","Sine 9th","Sine 10th","Sine 11th","Sine 12th","Sine 16th","Saw 1",
  104.     "Saw 2","Saw 3","Saw 4","Saw 5","Saw 6","Saw 7","Saw 8","Saw 9","Saw 10",
  105.     "Saw 11","Saw 12","Saw 13","Saw 14","Saw 15","Saw 16","Saw 17","Saw 18","Saw 19",
  106.     "Square 1","Square 2","Square 3","Square 4","Square 5","Inverse-Saw","Triangle",
  107.     "Random",
  108.     "French Horn","String 1","String 2","String Pad","Piano 1","El.Grand",
  109.     "E.Piano 1","E.Piano 2","E.Piano 3","Clavi","Vibe","A.Guitar","F.Guitar 1",
  110.     "F.Guitar 2","Ac Bass 1","Ac Bass 2","Digi Bass 1","Pick Bass","Digi Bass 2",
  111.     "Round Bass","Fretless 1","Fretless 2","Flute","Panflute","Harmonica","Glocken",
  112.     "Tine","Harp","Marimba","E.Tom","Log Drum","Jazz Organ 1","Mello Pad",
  113.     "Synth Solo","Synth 2",
  114.     "French Horn 1","French Horn 2","Brass 1","Brass 2","Brass 3","Brass 4",
  115.     "Trumpet 1","Trumpet 2","Violin","String","Piano 1","Piano 2","Piano 3",
  116.     "Piano 2b","Piano 3b","Piano 4","Piano 4b","El.Grand","E.Piano 1","E.Piano 2",
  117.     "E.Piano 3","Clavi","Harpsichord","Vibe","A.Guitar","F.Guitar","Strat 1",
  118.     "Strat 2","Ac Bass","Pull Bass 1","Pull Bass 2","Round Bass","Slap Bass 1",
  119.     "Slap Bass 2","Slap Bass 3","Fretless 1","Fretless 2","Synth Bass 1",
  120.     "Synth Bass 2","Harmonica","Clarinet 1","Clarinet 2","Oboe 1","Oboe 2",
  121.     "Shakuhachi","Oriental Bell 1","Oriental Bell 2","Bell","Koto","Sitar",
  122.     "E.Tom","Log Drum 1","Log Drum 2","Steel Drum 1","Steel Drum 2","Voice 1",
  123.     "Voice 2","Accordion 1","Accordion 2","Jazz Organ 2","Rock Organ 1","Draw Bar 1",
  124.     "Draw Bar 2","Pipe Organ 1","Pipe Organ 2","Rock Organ 2","Synth Solo 1",
  125.     "Synth Solo 2","Synth 2","Synth 2b","Synth 3",
  126.     "Brass 1","Brass 2","Orchestra","Piano 1","Piano 4","E.Piano 1","E.Piano 1b",
  127.     "E.Piano 2","E.Piano 3","Clavi","Harpsichord 1","Harpsichord 2","Vibe",
  128.     "Digi Bass 1","Digi Bass 2","Digi Bass 2b","Pick Bass","Glocken 1","Glocken 2",
  129.     "Tine 1","Tine 2","Tine 3","Tube Bell 1","Tube Bell 2","Tube Bell 3",
  130.     "Xylophone 1","Xylophone 2","Harp","Koto","Sitar 1","Sitar 2","Kalimba 1",
  131.     "Kalimba 2","Kalimba 3","Log Drum","Steel Drum","Pipe Organ 3","Pipe Organ 3b",
  132.     "Synth 1","Synth 2","Synth 3","Synth 3b","Synth 4","Synth 4b",
  133.     "Clavi","Digi Bass 1","Digi Bass 2","Pick Bass 1","Pick Bass 2","Round Bass 1",
  134.     "Round Bass 2","Harmonica 1","Harmonica 2","Harp","Koto","Sitar","Marimba",
  135.     "Synth 1",
  136.                         /* nun noch die PCM-Samples */
  137.     "Bass Drum","Ac Snare","Tight Snare","E.Snare","Rim","Ac Tom","HiHat","Crash",
  138.     "Ride","Strat Guitar","Fuzz Mute","A.Guitar","F.Guitar","Guitar Harmo","Pull Bass",
  139.     "Bass Harmo","Bowed String","String Attack","String Sus","Pizzicato","Piano",
  140.     "El.Grand","Piano Noise","Trumpet","Shakuhachi Att","Shakuhachi Sus","Panflute Att",
  141.     "Panflute Sus","Voice","White Noise",
  142.     "String Loop","Shakuhachi Loop","Panflute Loop","Voice Loop","White Noise Loop",
  143.     "Ac Snare Loop","F.Guitar Loop","Pull Bass Loop",
  144.     "Omni Loop 1","Omni Loop 2","Omni Loop 3","Omni Loop 4","Omni Loop 5","Omni Loop 6",
  145.     "Omni Loop 7","Omni Loop 8",
  146.     "Ac Snare Rev","Ac Tom Rev","F.Guitar Rev",
  147.     "HiHat Alt","Crash Alt","Piano Noise Alt"
  148. },
  149. *WriteError[4] =
  150. {    "Simple Write Error","Write Error: SynthMem writeprotected",
  151.     "Write Error: No Card","K1 doesn't respond"
  152. };
  153.  
  154. SHORT NormAB[22] = { 0,20,8,15,16,12,24,9,32,7,40,6,48,4,56,3,64,2,72,1,80,0 },
  155.     ABvec0[22], ABvec1[8] =
  156.     {    41,64,41,-1,123,-1,123,64
  157.     }, ABvec2[8] =
  158.     {    -2,1,129,1,129,21,-2,21
  159.     }, VBvec0[14], VBvec1[8] =
  160.     {    0,0,123,0,123,0,0,0
  161.     }, VBbas[4][14] =
  162.     {    0,0,0,0,0,0,30,30,61,0,92,-30,123,0,    /* die 4 Vibratokurven */
  163.         0,0,0,0,0,0,0,0,61,30,61,-30,123,0,
  164.         0,0,0,0,0,30,61,30,61,-30,123,-30,123,0,
  165.         0,20,20,25,41,-16,61,30,82,28,102,-30,123,-5
  166.     }, KSCvec[5][8] =
  167.     {    1,32,1,32,130,1,130,1,                    /* die 5 KS-Kurven */
  168.         1,32,43,27,86,18,130,1,
  169.         1,32,43,18,86,6,130,1,
  170.         1,32,50,32,80,1,130,1,
  171.         1,32,65,32,65,1,130,1
  172.     }, ENVvec[10] =
  173.     {    1,62,64,62,128,1,192,16,256,62
  174.     }, VCvec[8][8] =
  175.     {    1,32,1,32,130,1,130,1,                    /* die Velocity-Kurven */
  176.         1,32,43,18,86,6,130,1,
  177.         1,32,43,27,86,18,130,1,
  178.         1,32,78,26,104,17,130,1,
  179.         1,32,60,32,112,3,130,1,
  180.         1,32,31,28,100,5,130,1,
  181.         1,32,30,16,100,9,130,1,
  182.         1,1,65,1,100,32,130,32
  183.     };
  184. struct Border
  185.     ABlines2 = { 29,48,3,0,JAM1,4,ABvec2,NULL },
  186.     ABlines1 = { 29,48,3,0,JAM1,4,ABvec1,&ABlines2 },
  187.     ABlines = { 29,48,2,0,JAM1,11,ABvec0,&ABlines1 },
  188.     VBlines1 = { 347,79,3,0,JAM1,4,VBvec1,NULL },
  189.     VBlines = { 347,79,2,0,JAM1,7,VBvec0,&VBlines1 },
  190.     KSCline = { -2,-1,2,0,JAM1,4,KSCvec[0],NULL },
  191.     ENVline = { 30,23,2,0,JAM1,5,ENVvec,NULL },
  192.     VCline = { -2,-1,2,0,JAM1,4,VCvec[0],NULL };
  193.  
  194.  
  195.  
  196. struct IntuitionBase    *IntuitionBase;
  197. struct GfxBase            *GfxBase;
  198. struct Screen            *ms;
  199. struct Window            *wcom, *wwav, *wfrq, *wenv, *wacp, *wspc = NULL;
  200. struct Preferences        prefs;
  201.  
  202. struct MidiBase            *MidiBase;
  203. struct ReqBase            *ReqBase;
  204.  
  205. struct MDest            *dest;
  206. struct MSource            *src;
  207. struct MRoute            *inroute, *outroute;
  208.  
  209. UBYTE                    SoundData[128][88],
  210.                         request[9] = { MS_SYSEX,MID_KAWAI,0,K1_OBDR,K1_GROUP,KAWAI_K1,K1_INT,0,MS_EOX },
  211.                         *idata = NULL, *WarteZeiger = NULL;
  212.  
  213. int                        cardda = 0, iebase = 0, actual = 0, channel, envVoice = 0,
  214.                         kscurve = 0, wavetestnote = 60, specialfunktion, voicemask;
  215.  
  216. struct Process            *myprocess;
  217. APTR                    olderrorwindow;
  218. struct FileRequester    MyFileReqStruct;
  219. char                    filename[FCHARS],
  220.                         directoryname[DSIZE],
  221.                         answerarray[DSIZE+FCHARS],
  222.                         *extension[4] = { ".single",".block",".all",".dump" };
  223. struct TRStructure        meintrs = { 0,0,0,0,0,0,"Tell me:",0xFFFF,0,0,0,0,0,0 };
  224.  
  225. extern char                *get_fname();
  226. extern struct Library    *IconBase = NULL;
  227.  
  228. static struct MRouteInfo riin =
  229.     { MMF_SYSEX+MMF_PROG, -1, 0, 0, { 0,0,0,0 }, { 0,0,0,0 } };
  230.     /* d.h. nur SysExs passieren die Route */
  231. static struct MRouteInfo riout =
  232.     { MMF_SYSEX+MMF_CHAN, -1, 0, 0, { 0,0,0,0 }, { 0,0,0,0 } };
  233.     /* d.h. SysExs und alle ChannelMsgs passieren die Route */
  234.  
  235. USHORT oWarteZeiger[2][19] =
  236. {    0,0,
  237.     0x0180,0,0x0660,0,0x1818,0,0x6006,0,
  238.     0xffff,0x0000,0xf33f,0x0cc0,0xf57f,0x0a80,0xf331,0x0cce,
  239.     0xf57f,0x0a80,0xf33f,0x0cc0,0xffff,0x0000,0xd249,0x2db6,
  240.     0xb76b,0x4894,0xb36b,0x4c94,0xd75b,0x28a4,0xb34b,0x4cb4,
  241.     0xffff,0x0000,
  242.     0,0
  243. };
  244.  
  245.  
  246. /*******************************************************************/
  247.  
  248.  
  249.  
  250. int WoIsK1()                    /* -1 bei nirgends Ack, sonst 0..15 */
  251. {    static UBYTE req[5] = { MS_SYSEX,MID_KAWAI,0,K1_MIR,MS_EOX };
  252.     UBYTE *ack;
  253.     int chn;
  254.  
  255.     for(chn=0; chn<16; chn++)
  256.     {    req[OFFS_CHAN] = chn;
  257.         PutMidiMsg(src, req);
  258.         Delay(25L);
  259.         while(ack = GetMidiMsg(dest))
  260.             if(ack[OFFS_FUNC] == K1_MIA) return chn;
  261.     }
  262.     return -1;
  263. }
  264.  
  265. GetBlock(channel,ie,nr,data)    /* Einmal leersaugen, bitte */
  266.   int channel,ie,nr;
  267.   UBYTE *data;
  268. {    UBYTE *msg;
  269.  
  270.     request[OFFS_CHAN] = channel;
  271.     request[OFFS_FUNC] = K1_ABDR;
  272.     request[OFFS_SUB1] = ie;
  273.     request[OFFS_SUB2] = nr;
  274.     PutMidiMsg(src, request);
  275.  
  276.     WaitPort(dest->DestPort);
  277.     if(msg = GetMidiMsg(dest))
  278.     {    if(msg[OFFS_FUNC]==K1_ABDD) movmem(msg+OFFS_DATA, data, (nr < 64) ? 32*88 : 32*76);
  279.         FreeMidiMsg(msg);
  280.     }
  281. }
  282.  
  283. PutBlock(channel,ie,nr,data)    /* Einmal vollpumpen, bitte */
  284.   int channel,ie,nr;
  285.   UBYTE *data;
  286. {    UBYTE *msg,*reply;
  287.     int err = 4, bs = (nr < 64) ? 32*88 : 32*76;    /* BlockSize abh. von Single/Multi */
  288.     register int i;
  289.  
  290.     if(msg = AllocMem(9+bs, MEMF_PUBLIC+MEMF_CLEAR))
  291.     {    movmem(request, msg, 9);    /* den Header vom Request übernehmen */
  292.         msg[OFFS_CHAN] = channel;
  293.         msg[OFFS_FUNC] = K1_ABDD;
  294.         msg[OFFS_SUB1] = ie;
  295.         msg[OFFS_SUB2] = nr;
  296.         if(nr < 64) for(i=0; i<32; i++) CalcCheckSum(ie*64+nr+i);    /* Prüfsummen neu berechnen */
  297.         movmem(data, msg+OFFS_DATA, bs);
  298.         msg[OFFS_DATA+bs] = MS_EOX;
  299.         PutMidiMsg(src, msg);        /* Hinfort! Weiche von mir, elender Dump! */
  300.     }
  301.  
  302.     WaitPort(dest->DestPort);
  303.     if(reply = GetMidiMsg(dest))
  304.     {    err = reply[OFFS_FUNC];
  305.         FreeMidiMsg(reply);
  306.     }
  307.  
  308.     if(msg) FreeMem(msg, 9+bs);
  309.     return(err & 7);
  310. }
  311.  
  312. CalcCheckSum(n)                    /* Prüfsumme für Sound n berechnen */
  313.   int n;                        /* n = 0..127 */
  314. {    register int i,cs;
  315.     register UBYTE *a;
  316.  
  317.     a = SoundData[n];
  318.     for(i=0, cs=0xA5; i<87; ++i) cs = (cs + a[i]) & 127;
  319.     a[87] = cs;
  320. }
  321.  
  322. GetSound(channel,ie,nr,data)    /* Einmal Single, bitte */
  323.   int channel,ie,nr;
  324.   UBYTE *data;
  325. {    UBYTE *msg;
  326.  
  327.     request[OFFS_CHAN] = channel;
  328.     request[OFFS_FUNC] = K1_OBDR;
  329.     request[OFFS_SUB1] = ie;
  330.     request[OFFS_SUB2] = nr;
  331.     PutMidiMsg(src, request);
  332.     
  333.     WaitPort(dest->DestPort);
  334.     if(msg = GetMidiMsg(dest))
  335.     {    movmem(msg+OFFS_DATA, data, (nr < 64) ? 88 : 76);
  336.         FreeMidiMsg(msg);
  337.     }
  338. }
  339.  
  340. PutSound(channel, ie, nr, data)    /* Einen SingleSound senden */
  341.   int channel, ie, nr;
  342.   UBYTE *data;
  343. {    UBYTE msg[9+88], *reply;
  344.     int err = 4;
  345.  
  346.     movmem(request, msg, 9);    /* den Header vom Request übernehmen */
  347.     msg[OFFS_CHAN] = channel;
  348.     msg[OFFS_FUNC] = K1_OBDD;
  349.     msg[OFFS_SUB1] = ie;
  350.     msg[OFFS_SUB2] = nr;
  351.     CalcCheckSum(ie*64+nr);        /* Prüfsumme für den Sound */
  352.     movmem(data, msg+OFFS_DATA, 88);
  353.     msg[OFFS_DATA+88] = MS_EOX;
  354.     PutMidiMsg(src, msg);        /* und ab damit */
  355.  
  356.     WaitPort(dest->DestPort);    /* auf den Reply warten */
  357.     if(reply = GetMidiMsg(dest))
  358.     {    err = reply[OFFS_FUNC];
  359.         FreeMidiMsg(reply);
  360.     }
  361.  
  362.     WaitTOF();
  363.     WaitTOF();
  364.     WaitTOF();
  365.     WaitTOF();
  366.     WaitTOF();
  367.     ProgChange(nr);                /* Änderungen aktivieren */
  368.  
  369.     return(err & 7);
  370. }
  371.  
  372. NoteOn(note, vel)            /* Ton einschalten */
  373.   int note, vel;
  374. {    UBYTE msg[3];
  375.  
  376.     msg[0] = MS_NOTEON | channel;
  377.     msg[1] = note;
  378.     msg[2] = vel;
  379.     PutMidiMsg(src, msg);
  380. }
  381.  
  382. NoteOff(note)                /* Ton ausschalten */
  383.   int note;
  384. {    UBYTE msg[3];
  385.  
  386.     msg[0] = MS_NOTEOFF | channel;
  387.     msg[1] = note;
  388.     msg[2] = 64;
  389.     PutMidiMsg(src, msg);
  390. }
  391.  
  392. AllNotesOff()            /* Alle Töne ausschalten */
  393. {    UBYTE msg[3];
  394.  
  395.     msg[0] = MS_MODE | channel;
  396.     msg[1] = MM_ALLOFF;        /* All Notes Off */
  397.     msg[2] = 0;
  398.     PutMidiMsg(src, msg);    /* Alles aus */
  399. }
  400.  
  401. ProgChange(nr)            /* Sound wechseln */
  402.   int nr;
  403. {    UBYTE msg[3];
  404.  
  405.     msg[0] = MS_PROG | channel;
  406.     msg[1] = nr;
  407.     msg[2] = 0;
  408.     PutMidiMsg(src, msg);
  409. }
  410.  
  411. int UserRequest(text,a,b,c)
  412.   char *text,*a,*b,*c;
  413. {
  414.     meintrs.Text = text;
  415.     meintrs.NegativeText = a;        /* 0 (rechts) */
  416.     meintrs.PositiveText = b;        /* 1 (links) */
  417.     meintrs.MiddleText = c;            /* 2 (mitte) */
  418.  
  419.     return TextRequest(&meintrs);
  420. }
  421.  
  422. ImWorking()
  423. {    if(wspc) SetPointer(wspc,WarteZeiger,17,16,-8,-7);
  424.     SetPointer(wcom,WarteZeiger,17,16,-8,-7);
  425.     SetPointer(wwav,WarteZeiger,17,16,-8,-7);
  426.     SetPointer(wfrq,WarteZeiger,17,16,-8,-7);
  427.     SetPointer(wenv,WarteZeiger,17,16,-8,-7);
  428.     SetPointer(wacp,WarteZeiger,17,16,-8,-7);
  429. }
  430.  
  431. ImWaiting()
  432. {    if(wspc) ClearPointer(wspc);
  433.     ClearPointer(wcom);
  434.     ClearPointer(wwav);
  435.     ClearPointer(wfrq);
  436.     ClearPointer(wenv);
  437.     ClearPointer(wacp);
  438. }
  439.  
  440. float fabs(z)
  441.   float z;
  442. {
  443.     return((z < 0.0) ? -z : z);
  444. }
  445.  
  446. int iabs(z)
  447.   int z;
  448. {
  449.     return((z < 0) ? -z : z);
  450. }
  451.  
  452. struct Gadget *FindGadget(fe, id)
  453.   struct Window *fe;
  454.   int id;
  455. {    struct Gadget *ga;
  456.  
  457.     ga = fe->FirstGadget;
  458.     do
  459.         if(ga->GadgetID == id)    return(ga);
  460.     while((ga = ga->NextGadget) != NULL);
  461.  
  462.     return(NULL);
  463. }
  464.  
  465. EinGadget(w,g)
  466.   struct Window *w;
  467.   struct Gadget *g;
  468. {    SHORT l,t;
  469.  
  470.     if(g->UserData == 1) return;
  471.     
  472.     g->UserData = 1;
  473.     SetDrMd(w->RPort,JAM1+COMPLEMENT);
  474.     SetAPen(w->RPort,1);
  475.     l = g->LeftEdge; t = g->TopEdge;
  476.     RectFill(w->RPort,l,t,l+g->Width-1,t+g->Height-1);
  477. }
  478.  
  479. AusGadget(w,g)
  480.   struct Window *w;
  481.   struct Gadget *g;
  482. {    SHORT l,t;
  483.  
  484.     if(g->UserData == 0) return;
  485.     
  486.     g->UserData = 0;
  487.     SetDrMd(w->RPort,JAM1+COMPLEMENT);
  488.     SetAPen(w->RPort,1);
  489.     l = g->LeftEdge; t = g->TopEdge;
  490.     RectFill(w->RPort,l,t,l+g->Width-1,t+g->Height-1);
  491. }
  492.  
  493. TogGadget(w,g)
  494.   struct Window *w;
  495.   struct Gadget *g;
  496. {
  497.     if(g->UserData == 0) EinGadget(w,g); else AusGadget(w,g);
  498. }
  499.  
  500. ClearGadget(g,w)
  501.   struct Gadget *g;
  502.   struct Window *w;
  503. {
  504.     SetAPen(w->RPort, 0); SetDrMd(w->RPort, JAM1);
  505.     RectFill(w->RPort, g->LeftEdge-1, g->TopEdge,
  506.       g->LeftEdge+g->Width, g->TopEdge+g->Height-1);
  507. }
  508.  
  509. CleanUp()
  510. {
  511.     if(inroute) DeleteMRoute(inroute);
  512.     if(outroute) DeleteMRoute(outroute);
  513.     if(dest) DeleteMDest(dest);
  514.     if(src) DeleteMSource(src);
  515.     if(ReqBase) { PurgeFiles(&MyFileReqStruct); CloseLibrary(ReqBase); }
  516.     if(MidiBase) CloseLibrary(MidiBase);
  517.     if(wenv) { ClearMenuStrip(wenv); CloseWindow(wenv); }
  518.     if(wfrq) { ClearMenuStrip(wfrq); CloseWindow(wfrq); }
  519.     if(wwav) { ClearMenuStrip(wwav); CloseWindow(wwav); }
  520.     if(wcom) { ClearMenuStrip(wcom); CloseWindow(wcom); }
  521.     if(wacp) CloseWindow(wacp);
  522.     if(wspc) { ClearMenuStrip(wspc); CloseWindow(wspc); }
  523.     myprocess->pr_WindowPtr = olderrorwindow;
  524.     if(ms) CloseScreen(ms);
  525.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  526.     if(idata) FreeMem(idata, 80+76);
  527. }
  528.  
  529. shit(text)
  530.   char *text;
  531. {
  532.     if(text) UserRequest(text,0,0," Bye! ");
  533.     CleanUp();
  534.     exit(0);
  535. }
  536.  
  537. DrawNewEnvelope()
  538. {    register long delay,level;
  539.     register float fact;
  540.  
  541.     fact = 63.0 / 65535.0;
  542.     delay = 1+(long)(Gadget78SInfo.HorizPot * fact);
  543.     ENVvec[2] = delay;
  544.     ENVvec[4] = delay + (long)(Gadget81SInfo.HorizPot * fact);
  545.     ENVvec[6] = ENVvec[4] + (long)(Gadget83SInfo.HorizPot * fact);
  546.     ENVvec[8] = ENVvec[6] + (long)(Gadget80SInfo.HorizPot * fact);
  547.  
  548.     fact = 61.0 / 65535.0;
  549.     level = 61-(long)(Gadget79SInfo.VertPot * fact);
  550.     ENVvec[5] = 62-level;
  551.     ENVvec[7] = 62-(long)(level * (1.0 - Gadget82SInfo.VertPot / 65535.0));
  552.  
  553.     SetAPen(wenv->RPort,0); SetDrMd(wenv->RPort,JAM1);
  554.     RectFill(wenv->RPort,30,24,285,85);
  555.     DrawBorder(wenv->RPort,&ENVline,0,0);
  556. }
  557.  
  558. DrawABend()
  559. {    register int i,r;
  560.  
  561.     for(i=0; i<22; i+=2)
  562.     {    ABvec0[i] = 2 + (long)(NormAB[i] * Gadget16SInfo.HorizPot / 65535.0);
  563.         ABvec0[i+1] = 31 - (long)(NormAB[i+1] * (1.0 - Gadget9SInfo.VertPot / 32767.5));
  564.     }
  565.     r = (int)(ABvec0[20] * fabs(0.5 - Gadget4SInfo.HorizPot / 65535.0));
  566.     ABvec1[0] = ABvec1[2] = ABvec0[20]-r;
  567.     ABvec1[4] = ABvec1[6] = ABvec0[20]+r;
  568.     r = (int)((31-ABvec0[1]) * fabs(0.5 - Gadget17SInfo.VertPot / 65535.0));
  569.     ABvec2[1] = ABvec2[3] = ABvec0[1]-r;
  570.     ABvec2[5] = ABvec2[7] = ABvec0[1]+r;
  571.     SetAPen(wcom->RPort,0); SetDrMd(wcom->RPort,JAM1);
  572.     RectFill(wcom->RPort,27,47,158,112);
  573.     DrawBorder(wcom->RPort,&Border6,0,0);
  574. }
  575.  
  576. DrawVibrato()
  577. {    register int i,r;
  578.  
  579.     for(i=0; i<14; i+=2)
  580.     {    VBvec0[i] = (int)(VBbas[DS17 & 3][i] * Gadget18SInfo.HorizPot / 65535.0);
  581.         VBvec0[i+1] = (int)(VBbas[DS17 & 3][i+1] * (Gadget11SInfo.VertPot / 32767.5 - 1.0));
  582.     }
  583.     i = iabs((int)(30 * (Gadget11SInfo.VertPot / 32767.5 - 1.0)));        /* Amplitude */
  584.     r = i - (int)(30 * (Gadget15SInfo.VertPot / 32767.5 - 1.0));        /* Aftertouchrange */
  585.     if(r < 0) r = 0; else if(r > 30) r = 30;
  586.     VBvec1[1] = VBvec1[3] = -r;
  587.     VBvec1[5] = VBvec1[7] = r;
  588.  
  589.     SetAPen(wcom->RPort,0); SetDrMd(wcom->RPort,JAM1);
  590.     RectFill(wcom->RPort,347,49,471,111);
  591.     DrawBorder(wcom->RPort,&Border1,347,49);
  592.     DrawBorder(wcom->RPort,&VBlines,0,0);
  593. }
  594.  
  595. EnvDisplay()    /* das ENV-Fenster refreshen */
  596. {    register int i,id;
  597.     register ULONG w;
  598.     register struct PropInfo *si;
  599.     struct Gadget *FindGadget(), *g;
  600.  
  601.     for(i=0; i<11; i++)
  602.     {    id = EnvProp[i][0];                        /* Gadget-ID */
  603.         g = FindGadget(wenv,id);                /* Gadget finden */
  604.         si = g->SpecialInfo;                    /* davon die SpecialInfo */
  605.         w = ACTSOUND[EnvProp[i][1] + envVoice];    /* welchen Wert dafür? */
  606.  
  607.         if(si->Flags & FREEVERT) si->VertPot = 65535-655*w; else si->HorizPot = 655*w;
  608.         if(id < 50)        /* ein TextProp... */
  609.             sprintf( ((struct IntuiText *)(g->GadgetText))->IText, PrTe[id], w-50);
  610.             /* -50 (Offset) bei allen TextProps im ENV-Fenster */
  611.     }
  612.     SetAPen(wenv->RPort,0); SetDrMd(wenv->RPort,JAM1);
  613.     RectFill(wenv->RPort,313,25,442,55);
  614.     VCline.XY = VCvec[(DS35 & 0x70) >> 4];
  615.     *(wenv->Title + 7) = '1' + envVoice;        /* FensterTitel */
  616.     RefreshWindowFrame(wenv);
  617.     RefreshGadgets(wenv->FirstGadget,wenv,0);
  618.     DrawNewEnvelope();
  619. }
  620.  
  621. AktDisplay()                                /* kompletter Gadgetrefresh */
  622. {    register int i,j,id;
  623.     register ULONG w;
  624.     register struct PropInfo *si;
  625.     struct Gadget *FindGadget(), *g;
  626.  
  627.     ImWorking();
  628.     BoZa[0] =   DS11 & 3;                    /* zuerst die Bool2TextGadgets */
  629.     strcpy(IText3.IText,BoTe[0][BoZa[0]]);
  630.     BoZa[1] = ((DS11 &  4) >> 2);
  631.     strcpy(IText7.IText,BoTe[1][BoZa[1]]);
  632.     BoZa[2] = ((DS11 & 24) >> 3);
  633.     strcpy(IText87.IText,BoTe[2][BoZa[2]]);
  634.     BoZa[3] = ((DS11 & 96) >> 5);
  635.     strcpy(IText84.IText,BoTe[3][BoZa[3]]);
  636.     RefreshGList(&Gadget68, wwav, 0, 2);    /* extra: AmpMod */
  637.  
  638.     for(i=0; i<13; i++)
  639.     {    g = FindGadget(wcom,50+i);            /* Prop2Graf Gadget finden */
  640.         si = g->SpecialInfo;                /* davon die SpecialInfo */
  641.         w = ACTSOUND[GrafProp[i]];            /* welchen Wert dafür? */
  642.         if(si->Flags & FREEVERT)
  643.             si->VertPot = 65535 - w * si->VertBody;
  644.         else if(i==5)                        /* LFOspeed extra */
  645.             si->HorizPot = 65535 - w * si->HorizBody;
  646.         else
  647.             si->HorizPot = w * si->HorizBody;
  648.     }
  649.     Gadget3SInfo.HorizPot = actual * Gadget3SInfo.HorizBody;    /* Single */
  650.     sprintf(IText10.IText, "Single %2d", actual+1);
  651.     movmem(ACTSOUND, Gadget2SIBuff, 10);    /* Name */
  652.     Gadget2SIBuff[10] = 0;
  653.     Gadget10.Flags = Gadget10.Flags & ~SELECTED | (((DS17 & 0x20) >> 5) * SELECTED);    /* WheelAssign */
  654.     for(i=2; i<5; i++)
  655.     {    g = FindGadget(wcom,i);                /* Prop2Text Gadget finden */
  656.         si = g->SpecialInfo;                /* davon die SpecialInfo */
  657.         w = ACTSOUND[TextProp[i]];            /* welchen Wert dafür? */
  658.         si->HorizPot = w * si->HorizBody;
  659.         Prop2Text(wcom,g);
  660.     }
  661.     if(w = Gadget5.UserData) AusGadget(wcom, &Gadget5);
  662.     RefreshGadgets(wcom->FirstGadget, wcom, 0);
  663.     if(w) EinGadget(wcom, &Gadget5);
  664.  
  665.     w = MenuItem2.Flags & CHECKED;
  666.     MenuItem2.Flags &= ~CHECKED;
  667.     for(i=5; i<9; i++)
  668.     {    g = FindGadget(wwav,i);                /* Prop2Text Gadget finden */
  669.         si = g->SpecialInfo;                /* davon die SpecialInfo */
  670.         si->HorizPot = (ACTSOUND[26+i] + 128 * (ACTSOUND[30+i] & 1)) * 257;
  671.         Prop2Text(wwav,g);
  672.         RefreshGList(g, wwav, 0, 1);
  673.     }
  674.     if(w) MenuItem2.Flags |= CHECKED;
  675.     if(DS22 & 1) AusGadget(wwav,&Gadget70); else EinGadget(wwav,&Gadget70);
  676.     if(DS22 & 2) AusGadget(wwav,&Gadget71); else EinGadget(wwav,&Gadget71);
  677.     if(DS22 & 4) AusGadget(wwav,&Gadget72); else EinGadget(wwav,&Gadget72);
  678.     if(DS22 & 8) AusGadget(wwav,&Gadget73); else EinGadget(wwav,&Gadget73);
  679.     /* Flag gesetzt bedeutet Stimme stummgeschaltet!!! */
  680.  
  681.     for(i=0; i<4; i++)                        /* 4 Stimmen */
  682.     {    w = ACTSOUND[35 + i];                /* die Schalter... */
  683.         if(w & 2) EinGadget(wfrq,FindGadget(wfrq,207+i*3)); else AusGadget(wfrq,FindGadget(wfrq,207+i*3));
  684.         if(w & 8) EinGadget(wfrq,FindGadget(wfrq,208+i*3)); else AusGadget(wfrq,FindGadget(wfrq,208+i*3));
  685.         if(w & 4) EinGadget(wfrq,FindGadget(wfrq,209+i*3)); else AusGadget(wfrq,FindGadget(wfrq,209+i*3));
  686.         for(j=0; j<3; j++)                    /* mit jew. 3 PropGadgets */
  687.         {    g = FindGadget(wfrq, 9+i*3+j);    /* das sind die TextProps */
  688.             si = g->SpecialInfo;
  689.             if(j==0)
  690.             {    si->HorizBody = (ACTSOUND[35+i] & 2) ? 1365 : 636;
  691.                 PropOffset[9+i*3] = (ACTSOUND[35+i] & 2) ? -24 : 0;
  692.                 si->HorizPot  = (ACTSOUND[35+i] & 2) ? (ACTSOUND[FrqProps[j]+i]-60) * si->HorizBody
  693.                                                      : (ACTSOUND[FrqProps[j]+i]) * si->HorizBody;
  694.             }
  695.             else
  696.                 si->HorizPot  = ACTSOUND[FrqProps[j]+i] * si->HorizBody;
  697.             Prop2Text(wfrq,g);
  698.             RefreshGList(g, wfrq, 0, 1);
  699.         }
  700.     }
  701.  
  702.     DrawABend();
  703.     DrawVibrato();
  704.     EnvDisplay();
  705.     ImWaiting();
  706. }
  707.  
  708. Init(lace)
  709.   BOOL lace;
  710. {    long a,b,c,d;
  711.     FILE *fp;
  712.     struct ViewPort *vp;
  713.     int w,h;
  714.  
  715.     if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 33L)))
  716.         shit(0);
  717.     GfxBase=IntuitionBase->GfxBase;
  718.     GetPrefs(&prefs, sizeof(prefs));
  719.  
  720.     if(!(ReqBase = (struct ReqBase *)OpenLibrary("req.library", 0L)))
  721.     {    DisplayBeep(0L);
  722.         shit(0);
  723.     }
  724.     if(!(MidiBase = OpenLibrary(MIDINAME, MIDIVERSION)))
  725.         shit("Where is the midi.library?");
  726.     dest = CreateMDest(NULL, NULL);
  727.     src = CreateMSource(NULL, NULL);
  728.     inroute = MRouteDest("MidiIn", dest, &riin);
  729.     outroute = MRouteSource(src, "MidiOut", &riout);
  730.  
  731.     if((channel = WoIsK1()) == -1)
  732.     {    if(UserRequest("No K1 found. What now?"," Cancel "," Start anyway ",0))
  733.         {    MenuItem2.Flags &= ~(ITEMENABLED+CHECKED);        /* Wavetest */
  734.             MenuItem1.Flags &= ~(ITEMENABLED+CHECKED);        /* Autowrite */
  735.             MenuItem7.Flags &= ~ITEMENABLED;                /* Test Sound */
  736.             MenuItem9.Flags &= ~ITEMENABLED;                /* Put dump */
  737.             MenuItem8.Flags &= ~ITEMENABLED;                /* Get dump */
  738.             MenuItem13.Flags &= ~ITEMENABLED;                /* Write */
  739.             MenuItem12.Flags &= ~ITEMENABLED;                /* Read */
  740.  
  741.             cardda = 1;
  742.         }
  743.         else
  744.             shit(NULL);
  745.     }
  746.     else
  747.     {    riin.ChanFlags = 1L << channel;        /* Kanal bekannt: Kanalfilter EIN */
  748.         riout.ChanFlags = 1L << channel;
  749.         ModifyMRoute(inroute, &riin);        /* ...Routen erneuern */
  750.         ModifyMRoute(outroute, &riout);
  751.         GetBlock(channel,0, 0,SoundData);    /* Einmal leersaugen, bitte */
  752.         GetBlock(channel,0,32,SoundData[32]);
  753.         if(cardda = UserRequest("Is there a cartridge connected?"," Not at this moment "," For sure ",0))
  754.         {    GetBlock(channel,1, 0,SoundData[64]);    /* wenn geht, auch die externen */
  755.             GetBlock(channel,1,32,SoundData[96]);
  756.         }
  757.         else
  758.             Gadget5.Flags |= GADGDISABLED;
  759.     }
  760.  
  761.     idata = AllocMem(80+76, MEMF_CHIP);
  762.     movmem(ImageData6, idata, 40);
  763.     movmem(ImageData7, idata+40, 40);
  764.     Image6.ImageData = idata;
  765.     Image7.ImageData = idata+40;
  766.     movmem(oWarteZeiger,idata+80,76);    /* Maus-Zeigerdaten */
  767.     WarteZeiger = idata+80;
  768.     srand(time(NULL));
  769.  
  770.     vp = &IntuitionBase->ActiveScreen->ViewPort;
  771.     w = NewScreenStructure.Width  = vp->DWidth;
  772.     h = NewScreenStructure.Height = vp->DHeight;
  773.     NewScreenStructure.ViewModes  = vp->Modes;
  774.     if(lace && !(vp->Modes & LACE))        /* LACE als Option? */
  775.     {    NewScreenStructure.ViewModes |= LACE;
  776.         NewScreenStructure.Height = (h *= 2);
  777.     }
  778.     NewWindowStructure3.LeftEdge = (w - 348) / 2;
  779.     NewWindowStructure3.TopEdge  = (h - 78) / 2;
  780.     NewWindowStructure5.LeftEdge = w - 419;
  781.     NewWindowStructure5.TopEdge  = h - 172;
  782.     NewWindowStructure6.LeftEdge = w - 322;
  783.     NewWindowStructure7.TopEdge  = h - 123;
  784.     NewWindowStructure8.LeftEdge = w - 89;
  785.  
  786.     if((ms = OpenScreen(&NEWSCREENSTRUCTURE))==NULL) shit("No screen possible!");
  787.  
  788.     if(fp = fopen("DEVS:K1EDcolors","r"))
  789.     {    fscanf(fp, "%ld%ld%ld%ld", &a, &b, &c, &d);
  790.         fclose(fp);
  791.         SetRGB4(&ms->ViewPort, 0, (a & 0xf00) >> 8, (a & 0x0f0) >> 4, a & 0x00f );
  792.         SetRGB4(&ms->ViewPort, 1, (b & 0xf00) >> 8, (b & 0x0f0) >> 4, b & 0x00f );
  793.         SetRGB4(&ms->ViewPort, 2, (c & 0xf00) >> 8, (c & 0x0f0) >> 4, c & 0x00f );
  794.         SetRGB4(&ms->ViewPort, 3, (d & 0xf00) >> 8, (d & 0x0f0) >> 4, d & 0x00f );
  795.     }
  796.  
  797.     NewWindowStructure1.Screen = ms;
  798.     NewWindowStructure5.Screen = ms;
  799.     NewWindowStructure6.Screen = ms;
  800.     NewWindowStructure7.Screen = ms;
  801.     NewWindowStructure8.Screen = ms;
  802.     NewWindowStructure3.Screen = ms;
  803.  
  804.     wacp = OpenWindow(&NewWindowStructure8);
  805.     wfrq = OpenWindow(&NewWindowStructure5);
  806.     wenv = OpenWindow(&NewWindowStructure7);
  807.     wwav = OpenWindow(&NewWindowStructure6);
  808.     wcom = OpenWindow(&NewWindowStructure1);
  809.     if(wfrq==0 || wenv==0 || wwav==0 || wcom==0) shit("Can't open windows.");
  810.  
  811.     ImWorking();
  812.     myprocess = (struct Process *)FindTask((char *)0);
  813.     olderrorwindow = myprocess->pr_WindowPtr;
  814.     myprocess->pr_WindowPtr = (APTR)wcom;
  815.  
  816.     MyFileReqStruct.PathName = answerarray;
  817.     MyFileReqStruct.Dir = directoryname;
  818.     MyFileReqStruct.File = filename;
  819.     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM;
  820.     MyFileReqStruct.dirnamescolor = 2;
  821.     MyFileReqStruct.devicenamescolor = 2;
  822.  
  823.     Border6.NextBorder = &ABlines;        /* AutoBend */
  824.     Border1.NextBorder = &VBlines;        /* Vibrato */
  825.     Border2.NextBorder = &KSCline;        /* KS-Kurve */
  826.     Border51.NextBorder = &ENVline;        /* Envelope */
  827.     Border50.NextBorder = &VCline;        /* Velocity-Kurve */
  828.     DrawBorder(wcom->RPort,&BorderList1,0,0);
  829.     DrawBorder(wfrq->RPort,&BorderList5,0,0);
  830.     DrawBorder(wenv->RPort,&BorderList7,0,0);
  831.  
  832.     SetMenuStrip(wfrq,&MenuList1);
  833.     SetMenuStrip(wenv,&MenuList1);
  834.     SetMenuStrip(wwav,&MenuList1);
  835.     SetMenuStrip(wcom,&MenuList1);
  836.  
  837.     AktDisplay();
  838.  
  839.     SimpleRequest("\
  840.              ····································\n\
  841.             ···· Kawai K1 Single Sound Editor ····\n\
  842.             ···· Version 1.00  9.Februar 1990 ····\n\
  843.              ····································\n\n\
  844. This  program  is  SHAREWARE.  If you decide to use it, please\n\
  845. send  me  some money (what you think, it's worth - but please:\n\
  846. Not  less than 10 dollars, that wouldn't be worth the  effort)\n\
  847. (I won't go into legal details on ShareWare in this place).\n\
  848. Send money, bug reports and comments to:\n\n\
  849.                       Michael Balzer\n\
  850.                     Wildermuthstraße 18\n\
  851.                      5828 Ennepetal 14\n\
  852.                          W-GERMANY");
  853. }
  854.  
  855. ReverseVoices(o)
  856.   int o;
  857. {    register int a,z;
  858.     register UBYTE *act;
  859.  
  860.     ImWorking();
  861.     act = ACTSOUND;
  862.     for(a=23+o; a<86; a+=4)
  863.     {    z = act[a];
  864.         act[a] = act[a+1];
  865.         act[a+1] = z;
  866.     }
  867.     AktDisplay();    /* Alle Gadgets */
  868. }
  869.  
  870. WaveTest(v,w,on)        /* eine Wellenform testen */
  871.   int v,w;
  872.   BOOL on;
  873. {    UBYTE msg[10];
  874.  
  875.     NoteOff(wavetestnote, 64);
  876.     AllNotesOff();
  877.  
  878.     if(on)
  879.     {    movmem(request,msg,9);
  880.         msg[OFFS_FUNC] = K1_PS;        /* Parameter Send */
  881.         msg[OFFS_CHAN] = channel;
  882.         msg[OFFS_SUB1] = 35;
  883.         msg[OFFS_SUB2] = (v << 1) | ((w & 128) >> 7);
  884.         msg[OFFS_DATA] = w & 127;
  885.         msg[OFFS_DATA+1] = MS_EOX;
  886.         PutMidiMsg(src, msg);        /* neue Wellenform setzen */
  887.         WaitTOF();
  888.         WaitTOF();
  889.         WaitTOF();
  890.  
  891.         NoteOn(wavetestnote, 80);
  892.     }
  893. }
  894.  
  895. Bool2Text(w,g)
  896.   struct Window *w;
  897.   struct Gadget *g;
  898. {    int id;
  899.     char *s;
  900.  
  901.     id = g->GadgetID - 100;
  902.     s = ((struct IntuiText *)(g->GadgetText))->IText;
  903.     if(BoTe[id][++BoZa[id]] == 0) BoZa[id]=0;        /* Text weiterschalten */
  904.  
  905.     if((id==5) && (BoZa[4]==1))        /* kein "int/ext" bei MULTI */
  906.     {    if(BoZa[5]==1) BoZa[5]++;
  907.         else if(BoZa[5]==3) BoZa[5]=0;
  908.     }
  909.  
  910.     strcpy(s,BoTe[id][BoZa[id]]);
  911.     RefreshGList(g,w,0,1);
  912.     if(id < 4) ACTSOUND[11] = BoZa[0] + (BoZa[1]<<2) + (BoZa[2]<<3) + (BoZa[3]<<5);
  913.  
  914.     if((id==2) && (BoZa[2]!=1)) ReverseVoices(0);    /* VoiceParameter tauschen, wenn */
  915.     if((id==3) && (BoZa[3]!=1)) ReverseVoices(2);    /* AM von oder auf REV kommt */
  916. }
  917.  
  918. Prop2Text(w,g)
  919.   struct Window *w;
  920.   struct Gadget *g;
  921. {    int id,x,y,c;
  922.     register char *s;
  923.     register struct IntuiMessage *m;
  924.     register long pw,opw=-1000;
  925.     struct Gadget *FindGadget();
  926.     char namebuf[11];
  927.  
  928.     id = g->GadgetID;
  929.     s = ((struct IntuiText *)(g->GadgetText))->IText;
  930.     x = g->LeftEdge;
  931.     y = g->TopEdge;
  932.  
  933.     do
  934.     {    pw = PropOffset[id] + (long)(g->SpecialInfo->HorizPot / g->SpecialInfo->HorizBody);
  935.         if(pw != opw)
  936.         { switch(id)
  937.           {    case 1:
  938.                 actual = pw-1;
  939.                 sprintf(s, "Single %2d", pw);
  940.                 movmem(ACTSOUND, Gadget2SIBuff, 10);
  941.                 Gadget2SIBuff[10] = 0;
  942.                 RefreshGList(&Gadget2,wcom,0,1);
  943.                 break;
  944.             case 5: case 6: case 7: case 8:
  945.                 ACTSOUND[26+id] = pw-1 & 127;
  946.                 if(pw > 128) ACTSOUND[30+id] |= 1; else ACTSOUND[30+id] &= ~1;
  947.                 if(pw > 204)
  948.                 {         if(pw>252) c='a';
  949.                     else if(pw>249) c='r';
  950.                     else if(pw>241) c='L';
  951.                     else if(pw>233) c='l';
  952.                     else            c='o';
  953.                     sprintf(s, "Src %d: %3d. P%c %-18s", id-4, pw, c, WaveName[pw-1]);
  954.                     if(WAVETEST) WaveTest(id-5,pw-1,TRUE);
  955.                     break;
  956.                 }
  957.                 else if(pw<40)  c='b';
  958.                 else if(pw<75)  c='l';
  959.                 else if(pw<146) c='m';
  960.                 else if(pw<190) c='t';    /* Treble anstelle Mid-Hi */
  961.                 else            c='h';
  962.                 sprintf(s, "Src %d: %3d. V%c %-18s", id-4, pw, c, WaveName[pw-1]);
  963.                 if(WAVETEST) WaveTest(id-5,pw-1,TRUE);
  964.                 break;
  965.             case 9: case 12: case 15: case 18:
  966.                 if((long)FindGadget(wfrq,198+id)->UserData == 1)
  967.                 {    sprintf(s, "Freq Coarse = %c%2d%c", (pw < 0) ? '-' : '+', iabs(pw) >> 1, (pw & 1) ? '½' : ' ');
  968.                     ACTSOUND[27+(id-9)/3] = pw + 84;
  969.                 }
  970.                 else
  971.                 {    sprintf(s, "Fixed Key   = %2s%2d", ToneName[pw % 12], (int)(pw / 12) - 2);
  972.                     ACTSOUND[27+(id-9)/3] = pw;
  973.                 }
  974.                 break;
  975.             case 26:
  976.                 movmem(SoundData[SCARD*64+pw-1], namebuf, 10);
  977.                 namebuf[10] = 0;
  978.                 sprintf(s, PrTe[26], pw, namebuf);
  979.                 break;
  980.             case 27:
  981.                 movmem(SoundData[DCARD*64+pw-1], namebuf, 10);
  982.                 namebuf[10] = 0;
  983.                 sprintf(s, PrTe[27], pw, namebuf);
  984.                 break;
  985.             default:
  986.                 sprintf(s, PrTe[id], pw);
  987.                 if(id < 21) ACTSOUND[TextProp[id]] = pw - PropOffset[id];
  988.                 else if(id < 26) ACTSOUND[TextProp[id]+envVoice] = pw - PropOffset[id];
  989.           }
  990.           PrintIText(w->RPort,g->GadgetText,x,y);
  991.           opw = pw;
  992.         }
  993.         WaitTOF();
  994.     } while((long)g->Flags & SELECTED);
  995.  
  996.     if(id > 4 && id < 9 && WAVETEST) WaveTest(id-5,pw-1,FALSE);
  997.     if(id==1)
  998.     {    ProgChange(actual);            /* anderen Sound bearbeiten */
  999.         AktDisplay();
  1000.     }
  1001.     if(m = GetMsg(w->UserPort))
  1002.         ReplyMsg(m);                /* GADGRELEASE replyen */
  1003. }
  1004.  
  1005. Bool2Graf(w,g)
  1006.   struct Window *w;
  1007.   struct Gadget *g;
  1008. {    register int we;
  1009.  
  1010.     switch(g->GadgetID)
  1011.     {
  1012.         case 150:                        /* Vibrato Wellenform */
  1013.             we = ((DS17 & 3) + 1) % 4;
  1014.             DS17 = DS17 & ~3 | we;
  1015.             DrawVibrato();
  1016.             break;
  1017.  
  1018.         case 151:                        /* KS Curve */
  1019.             we = (((DS17 & 28) >> 2) + 1) % 5;
  1020.             DS17 = DS17 & ~28 | we << 2;
  1021.             KSCline.XY = KSCvec[we];
  1022.             ClearGadget(g,w);
  1023.             DrawBorder(w->RPort,&KSCline,g->LeftEdge,g->TopEdge);
  1024.             break;
  1025.  
  1026.         case 152:                        /* Velocity Curve */
  1027.             we = (((DS35 & 0x70) >> 4) + 1) % 8;
  1028.             DS35 = DS35 & ~0x70 | we << 4;
  1029.             VCline.XY = VCvec[we];
  1030.             ClearGadget(g,w);
  1031.             DrawBorder(w->RPort,&VCline,g->LeftEdge,g->TopEdge);
  1032.     }
  1033. }
  1034.  
  1035. Prop2Graf(w,g)
  1036.   struct Window *w;
  1037.   struct Gadget *g;
  1038. {    register long pw,opw=-1000;
  1039.     struct PropInfo *si;
  1040.     int id;
  1041.     static GrafOffset[13] = { -50,-50,0,-50, -50,0,-50, 0,0,0,0,0,0 };
  1042.  
  1043.     si = g->SpecialInfo;
  1044.     id = g->GadgetID;
  1045.     if(wacp) WindowToFront(wacp);
  1046.  
  1047.     do
  1048.     {    if(si->Flags & FREEHORIZ)
  1049.             pw = (long)(g->SpecialInfo->HorizPot / g->SpecialInfo->HorizBody);
  1050.         else
  1051.             pw = (long)((65535-g->SpecialInfo->VertPot) / g->SpecialInfo->VertBody);
  1052.         if(id == 55) pw = 100 - pw;        /* VibSpeed umdrehen */
  1053.  
  1054.         if(pw != opw)
  1055.         {    if(id > 56)
  1056.             {    ACTSOUND[GrafProp[id-50] + envVoice] = pw;
  1057.                 DrawNewEnvelope();
  1058.             }
  1059.             else
  1060.             {    ACTSOUND[GrafProp[id-50]] = pw;
  1061.                 if(id < 54) DrawABend();
  1062.                 else DrawVibrato();
  1063.             }
  1064.             opw = pw;
  1065.         }
  1066.         sprintf(IText97.IText, "%4d", GrafOffset[id-50]+pw);
  1067.         PrintIText(wacp->RPort, &IText97, 0,0);
  1068.  
  1069.     } while((long)g->Flags & SELECTED);
  1070.  
  1071.     WaitPort(w->UserPort);
  1072.     ReplyMsg(GetMsg(w->UserPort));
  1073. }
  1074.  
  1075. MakeInfo(s)
  1076.   char *s;
  1077. {    UBYTE info[2048];
  1078.     FILE *ifp, *fi;
  1079.     int l;
  1080.     char t[64];
  1081.  
  1082.     strcpy(t,s); strcat(t,".info");
  1083.     if(ifp=fopen("T:MIDIicon","r"))
  1084.     {    l = fread(info, 1, 2048, ifp);
  1085.         if(fi=fopen(t,"w"))
  1086.         {    fwrite(info, l, 1, fi);
  1087.             fclose(fi);
  1088.         }
  1089.         fclose(ifp);
  1090.     }
  1091. }
  1092.  
  1093. GetDump(ie, data)                    /* einen KOMPLETT-Dump einer Bank holen */
  1094.   int ie; UBYTE *data;
  1095. {
  1096.     ImWorking();
  1097.     GetBlock(channel, ie,  0, data);
  1098.     GetBlock(channel, ie, 32, data+2816);
  1099.     GetBlock(channel, ie, 64, data+5650);
  1100.     ImWaiting();
  1101. }
  1102.  
  1103. int PutDump(ie, data)                /* einen KOMPLETT-Dump einer Bank senden */
  1104.   int ie; UBYTE *data;
  1105. {    int err=4;
  1106.  
  1107.     ImWorking();
  1108.     err  = PutBlock(channel, ie,  0, data);
  1109.     err |= PutBlock(channel, ie, 32, data+2816);
  1110.     err |= PutBlock(channel, ie, 64, data+5650);
  1111.     ImWaiting();
  1112.  
  1113.     return err;
  1114. }
  1115.  
  1116. char *extend(name,ext)
  1117.   char *name, *ext;
  1118. {    static char buffer[64];
  1119.     char *s;
  1120.  
  1121.     if(s = rindex(name, '.'))
  1122.         if(strncmp(s, ext) == 0) return name;
  1123.  
  1124.     strcpy(buffer,name);
  1125.     strcat(buffer,ext);
  1126.     return buffer;
  1127. }
  1128.  
  1129. OpenSpecial()                    /* Specialsetup-Fenster öffnen */
  1130. {    static char *tit[4] = { "Exchange two Sounds","Mix Sound to another",
  1131.         "Compute Soundrange (w/Rnd)","Copy Sound (w/Rnd)" };
  1132.  
  1133.     if(wspc) { ClearMenuStrip(wspc); CloseWindow(wspc); }
  1134.     NewWindowStructure3.Title = tit[specialfunktion];
  1135.     switch(specialfunktion)
  1136.     {    case 0:
  1137.             PrTe[26] = "SoundA: %2d = %-10s";
  1138.             PrTe[27] = "SoundB: %2d = %-10s";
  1139.             PrTe[28] = "-----------";
  1140.             Gadget28.Flags |= GADGDISABLED;
  1141.             break;
  1142.         case 1:
  1143.             PrTe[26] = "Sound : %2d = %-10s";
  1144.             PrTe[27] = "Into  : %2d = %-10s";
  1145.             PrTe[28] = "%3d%% Weight";
  1146.             Gadget28.Flags &= ~GADGDISABLED;
  1147.             break;
  1148.         case 2:
  1149.             PrTe[26] = "Start : %2d = %-10s";
  1150.             PrTe[27] = "End   : %2d = %-10s";
  1151.             PrTe[28] = "%3d%% Random";
  1152.             Gadget28.Flags &= ~GADGDISABLED;
  1153.             break;
  1154.         case 3:
  1155.             PrTe[26] = "Source: %2d = %-10s";
  1156.             PrTe[27] = "Destin: %2d = %-10s";
  1157.             PrTe[28] = "%3d%% Random";
  1158.             Gadget28.Flags &= ~GADGDISABLED;
  1159.     }
  1160.     if((wspc = OpenWindow(&NewWindowStructure3)) == NULL)
  1161.         SimpleRequest("Can't open setup-window...");
  1162.     else
  1163.     {    SetMenuStrip(wspc, &MenuList1);
  1164.         Prop2Text(wspc, &Gadget26);
  1165.         Prop2Text(wspc, &Gadget27);
  1166.         Prop2Text(wspc, &Gadget28);
  1167.     }
  1168. }
  1169.  
  1170. HandleMenu(code)                        /* Na was wohl */
  1171.   USHORT code;
  1172. {    int ie, err;
  1173.     long ColorRequester();
  1174.     FILE *fp;
  1175.     UBYTE *data;
  1176.     char *s, com[2];
  1177.     static struct GetLongStruct gl = { "Which note for wavetest? (0..127)",
  1178.         60,0,127,0,NULL,0,0,0 };
  1179.  
  1180.     switch(MENUNUM(code))
  1181.     {    case 0:                            /*** PROJECT ***/
  1182.             switch(ITEMNUM(code))
  1183.             {    case 0:                    /* ...Load */
  1184.                     ie = UserRequest("What shall I load?"," Act.Sound "," Act.Block "," All ");
  1185.                     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQLOADINGM;
  1186.                     MyFileReqStruct.Title = "Load Sounddata:";
  1187.                     MyFileReqStruct.Show[0] = '*';
  1188.                     strcpy(MyFileReqStruct.Show + 1, extension[ie]);
  1189.                     if(FileRequester(&MyFileReqStruct))
  1190.                     {    if(fp = fopen(answerarray, "r+"))
  1191.                         {    ImWorking();
  1192.                             switch(ie)
  1193.                             {    case 0:    fread(ACTSOUND, 88, 1, fp); break;
  1194.                                 case 1:    fread(SoundData[iebase*64 + (actual & 32)], 32*88, 1, fp); break;
  1195.                                 case 2:    fread(SoundData, 128*88, 1, fp);
  1196.                             }
  1197.                             fclose(fp);
  1198.                             AktDisplay();
  1199.                         }
  1200.                         else SimpleRequest("Can't open file %s.", answerarray);
  1201.                     }
  1202.                     break;
  1203.                 case 1:                    /* ...Save */
  1204.                     ie = UserRequest("What shall I save?"," Act.Sound "," Act.Block "," All ");
  1205.                     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQSAVINGM;
  1206.                     MyFileReqStruct.Title = "Save Sounddata:";
  1207.                     MyFileReqStruct.Show[0] = '*';
  1208.                     strcpy(MyFileReqStruct.Show + 1, extension[ie]);
  1209.                     if(FileRequester(&MyFileReqStruct))
  1210.                     {    if(fp = fopen(s = extend(answerarray, extension[ie]), "w+"))
  1211.                         {    ImWorking();
  1212.                             switch(ie)
  1213.                             {    case 0:    fwrite(ACTSOUND, 88, 1, fp); break;
  1214.                                 case 1:    fwrite(SoundData[iebase*64 + (actual & 32)], 32*88, 1, fp); break;
  1215.                                 case 2:    fwrite(SoundData, 128*88, 1, fp);
  1216.                             }
  1217.                             fclose(fp);
  1218.                             ImWaiting();
  1219.                         }
  1220.                         else SimpleRequest("Can't open file %s.", s);
  1221.                     }
  1222.                     break;
  1223.                 case 2:                    /* ...Read */
  1224.                     ie = UserRequest("What shall I read?"," Act.Sound "," Act.Block "," All ");
  1225.                     ImWorking();
  1226.                     switch(ie)
  1227.                     {    case 0:    GetSound(channel, iebase, actual, ACTSOUND); break;
  1228.                         case 1:    GetBlock(channel, iebase, actual & 32, SoundData[iebase*64 + (actual&32)]); break;
  1229.                         case 2:
  1230.                             GetBlock(channel,0, 0,SoundData);        /* Einmal leersaugen, bitte */
  1231.                             GetBlock(channel,0,32,SoundData[32]);
  1232.                             if(cardda)
  1233.                             {    GetBlock(channel,1, 0,SoundData[64]);    /* wenn geht, auch die externen */
  1234.                                 GetBlock(channel,1,32,SoundData[96]);
  1235.                             }
  1236.                     }
  1237.                     AktDisplay();
  1238.                     break;
  1239.                 case 3:                    /* ...Write */
  1240.                     ie = UserRequest("What shall I write?"," Act.Sound "," Act.Block "," All ");
  1241.                     ImWorking();
  1242.                     switch(ie)
  1243.                     {    case 0:    PutSound(channel, iebase, actual, ACTSOUND); break;
  1244.                         case 1: PutBlock(channel, iebase, actual & 32, SoundData[iebase*64 + (actual&32)]); break;
  1245.                         case 2:
  1246.                             PutBlock(channel,0, 0,SoundData);        /* Einmal vollpumpen, bitte */
  1247.                             PutBlock(channel,0,32,SoundData[32]);
  1248.                             if(cardda)
  1249.                             {    PutBlock(channel,1, 0,SoundData[64]);    /* wenn geht, auch die externen */
  1250.                                 PutBlock(channel,1,32,SoundData[96]);
  1251.                             }
  1252.                     }
  1253.                     ImWaiting();
  1254.                     break;
  1255.                 case 4:                    /* ...Quit */
  1256.                     if(UserRequest("Really terminate program?"," Oh NO!!! "," That is indeed my will. ",0))
  1257.                         shit(0);
  1258.                     break;
  1259.             }
  1260.             break;
  1261.         case 1:                            /*** DUMP ***/
  1262.             if((data = AllocMem(8082, MEMF_PUBLIC+MEMF_CLEAR)) == NULL)
  1263.             {    SimpleRequest("Too low on memory!");
  1264.                 break;
  1265.             }
  1266.             switch(ITEMNUM(code))
  1267.             {    case 0:                    /* ...Get */
  1268.                     ie = UserRequest("From which soundbank?"," Internal "," External ",0);
  1269.                     GetDump(ie, data);
  1270.                     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQSAVINGM;
  1271.                     MyFileReqStruct.Title = "Save dumpfile:";
  1272.                     MyFileReqStruct.Show[0] = '*';
  1273.                     strcpy(MyFileReqStruct.Show + 1, extension[3]);
  1274.                     if(FileRequester(&MyFileReqStruct))
  1275.                     {    if(fp = fopen(s = extend(answerarray, extension[3]), "w+"))
  1276.                         {    ImWorking();
  1277.                             fwrite(data, 8082, 1, fp);
  1278.                             fclose(fp);
  1279.                             MakeInfo(s);        /* Icon erstellen für PutDump-Programm */
  1280.                             ImWaiting();
  1281.                         }
  1282.                         else SimpleRequest("Can't open %s.", s);
  1283.                     }
  1284.                     break;
  1285.                 case 1:                    /* ...Put */
  1286.                     MyFileReqStruct.Flags = FRQCACHINGM+FRQINFOGADGETM+FRQLOADINGM;
  1287.                     MyFileReqStruct.Title = "Load dumpfile:";
  1288.                     MyFileReqStruct.Show[0] = '*';
  1289.                     strcpy(MyFileReqStruct.Show + 1, extension[3]);
  1290.                     if(FileRequester(&MyFileReqStruct))
  1291.                     {    if(fp = fopen(answerarray, "r+"))
  1292.                         {    ImWorking();
  1293.                             err = fread(data, 8082, 1, fp);
  1294.                             fclose(fp);
  1295.                             if(err == 1)
  1296.                             {    ie = UserRequest("Into which soundbank?"," Internal "," External ",0);
  1297.                                 if(err = PutDump(ie, data))
  1298.                                     SimpleRequest(WriteError[err-1]);
  1299.                                 else if(UserRequest("Shall I update the editormemory?"," No "," Yes ",0) == 1)
  1300.                                 {    GetBlock(channel,ie, 0,SoundData);        /* Einmal leersaugen, bitte */
  1301.                                     GetBlock(channel,ie,32,SoundData[32]);    /* aber nur was gerade geputtet wurde */
  1302.                                     AktDisplay();
  1303.                                 }
  1304.                             }
  1305.                             else SimpleRequest("Error in file %s.", answerarray);
  1306.                             ImWaiting();
  1307.                         }
  1308.                         else SimpleRequest("Can't open %s.", answerarray);
  1309.                     }
  1310.                     break;
  1311.             }
  1312.             FreeMem(data, 8082);
  1313.             break;
  1314.         case 2:                            /*** SPECIAL ***/
  1315.             if(ITEMNUM(code) < 4)
  1316.             {    specialfunktion = ITEMNUM(code);
  1317.                 OpenSpecial();
  1318.             }
  1319.             else
  1320.             {    if(fp = fopen("T:TestSequenz","r"))
  1321.                 {    ImWorking();
  1322.                     while(!feof(fp))
  1323.                     {    fscanf(fp,"%1s%d%d",com,&ie,&err);        /* command + 2 parameter */
  1324.                         switch(com[0])
  1325.                         {    case 'D':    Delay(ie);            break;
  1326.                             case '1':    NoteOn(ie, err);    break;
  1327.                             case '0':    NoteOff(ie);        break;
  1328.                             case 'A':    AllNotesOff();
  1329.                         }
  1330.                     }
  1331.                     fclose(fp);
  1332.                     AllNotesOff();
  1333.                     ImWaiting();
  1334.                 }
  1335.                 else
  1336.                     SimpleRequest("Can't find »T:TestSequenz«.");
  1337.             }
  1338.             break;
  1339.         case 3:                            /*** DUMP ***/
  1340.             switch(ITEMNUM(code))
  1341.             {    case 0:                    /* ...Autowrite */
  1342.                     if(AUTOWRITE)        /* beim einschalten: akt.Sound senden */
  1343.                         if(err = PutSound(channel, iebase, actual, ACTSOUND))
  1344.                             SimpleRequest(WriteError[err-1]);
  1345.                     break;
  1346.                 case 1:                    /* ...Wavetest */
  1347.                     if(WAVETEST && GetLong(&gl))    /* beim einschalten: Note festlegen */
  1348.                         wavetestnote = gl.result;
  1349.                     break;
  1350.                 case 2:                    /* ...Farben */
  1351.                     if(ColorRequester(-1L) != -1L)        /* Gott segne den Schöpfer der RequesterLib */
  1352.                         if(UserRequest("Save colors?"," Preferably not "," Would be fine ",0))
  1353.                         {    if(fp = fopen("DEVS:K1EDcolors","w"))
  1354.                             {    fprintf(fp, "%ld %ld %ld %ld\n",
  1355.                                     GetRGB4(ms->ViewPort.ColorMap, 0),
  1356.                                     GetRGB4(ms->ViewPort.ColorMap, 1),
  1357.                                     GetRGB4(ms->ViewPort.ColorMap, 2),
  1358.                                     GetRGB4(ms->ViewPort.ColorMap, 3) );
  1359.                                 fclose(fp);
  1360.                             }
  1361.                         }
  1362.             }
  1363.     }
  1364. }
  1365.  
  1366. int rangeran(alt, rng, proz)
  1367.   int alt, rng;
  1368.   float proz;
  1369. {    int neu;
  1370.  
  1371.     neu = alt + proz * rng * ( rand() / 16384.0 - 1 );
  1372.     if(neu > rng) neu -= rng;
  1373.     else if(neu < 0) neu += rng;
  1374.     return neu;
  1375. }
  1376.  
  1377. SpecialExchange(a, b)
  1378.   UBYTE *a, *b;
  1379. {    register int i, z;
  1380.  
  1381.     if(COMMON)
  1382.         swapmem(a, b, 23);
  1383.     if(FREQUENCY) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1384.     {    SSWAP(23+i);
  1385.         SSWAP(27+i);
  1386.         SSWAP(83+i);
  1387.         z=a[35+i];
  1388.         a[35+i] &= ~14; a[35+i] |= b[35+i] & 14;
  1389.         b[35+i] &= ~14; b[35+i] |= z & 14;
  1390.     }
  1391.     if(WAVEFORM) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1392.     {    SSWAP(31+i);
  1393.         z=a[35+i];
  1394.         a[35+i] &= ~1; a[35+i] |= b[35+i] & 1;
  1395.         b[35+i] &= ~1; b[35+i] |= z & 1;
  1396.     }
  1397.     if(ENVELOPE) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1398.     {    SSWAP(39+i);
  1399.         SSWAP(43+i);
  1400.         SSWAP(47+i);
  1401.         SSWAP(51+i);
  1402.         SSWAP(55+i);
  1403.         SSWAP(59+i);
  1404.         SSWAP(63+i);
  1405.         SSWAP(67+i);
  1406.         SSWAP(71+i);
  1407.         SSWAP(75+i);
  1408.         SSWAP(79+i);
  1409.         z=a[35+i];
  1410.         a[35+i] &= ~112; a[35+i] |= b[35+i] & 112;
  1411.         b[35+i] &= ~112; b[35+i] |= z & 112;
  1412.     }
  1413. }
  1414.  
  1415. SpecialMix(a, b, p)
  1416.   UBYTE *a, *b;
  1417.   float p;
  1418. {    register int i, z;
  1419.     register float q;
  1420.  
  1421.     q = 1.0 - p;
  1422.     if(COMMON) for(i=10; i<23; i++) switch(i)
  1423.     {    case 11:
  1424.             z = (int)(q*(b[11]&3) + p*(a[11]&3)) & 3;
  1425.             b[11] &= ~3; b[11] |= z;
  1426.             z = (int)(q*((b[11]&4)>>2) + p*((a[11]&4)>>2)) & 1;
  1427.             b[11] &= ~4; b[11] |= z << 2;
  1428.             z = (int)(q*((b[11]&24)>>3) + p*((a[11]&24)>>3)) & 3;
  1429.             b[11] &= ~24; b[11] |= z << 3;
  1430.             z = (int)(q*((b[11]&96)>>5) + p*((a[11]&96)>>5)) & 3;
  1431.             b[11] &= ~96; b[11] |= z << 5;
  1432.             break;
  1433.         case 17:
  1434.             z = (int)(q*(b[17]&3) + p*(a[17]&3)) & 3;
  1435.             b[17] &= ~3; b[17] |= z;
  1436.             z = (int)(q*((b[17]&28)>>2) + p*((a[17]&28)>>2)) & 7;
  1437.             b[17] &= ~28; b[17] |= z << 2;
  1438.             z = (int)(q*((b[17]&96)>>5) + p*((a[17]&96)>>5)) & 3;
  1439.             b[17] &= ~96; b[17] |= z << 5;
  1440.             break;
  1441.         case 22:
  1442.             b[22] &= a[22];        /* Src Mute nicht sinnvoll für Mix */
  1443.             break;
  1444.         default:
  1445.             b[i] = (int)(q * b[i] + p * a[i]);
  1446.     }
  1447.     if(FREQUENCY) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1448.     {    b[23+i] = (int)(q * b[23+i] + p * a[23+i]);
  1449.         b[27+i] = (int)(q * b[27+i] + p * a[27+i]);
  1450.         b[83+i] = (int)(q * b[83+i] + p * a[83+i]);
  1451.  
  1452.         z = (int)(q*((b[35+i]&2)>>1) + p*((a[35+i]&2)>>1)) & 1;
  1453.         b[35+i] &= ~2; b[35+i] |= z << 1;
  1454.         z = (int)(q*((b[35+i]&4)>>2) + p*((a[35+i]&4)>>2)) & 1;
  1455.         b[35+i] &= ~4; b[35+i] |= z << 2;
  1456.         z = (int)(q*((b[35+i]&8)>>3) + p*((a[35+i]&8)>>3)) & 1;
  1457.         b[35+i] &= ~8; b[35+i] |= z << 3;
  1458.     }
  1459.     if(WAVEFORM) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1460.     {    b[31+i] = (int)(q * b[31+i] + p * a[31+i]);
  1461.  
  1462.         z = (int)(q*(b[35+i]&1) + p*(a[35+i]&2)) & 1;
  1463.         b[35+i] &= ~1; b[35+i] |= z;
  1464.     }
  1465.     if(ENVELOPE) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1466.     {    b[39+i] = (int)(q * b[39+i] + p * a[39+i]);
  1467.         b[43+i] = (int)(q * b[43+i] + p * a[43+i]);
  1468.         b[47+i] = (int)(q * b[47+i] + p * a[47+i]);
  1469.         b[51+i] = (int)(q * b[51+i] + p * a[51+i]);
  1470.         b[55+i] = (int)(q * b[55+i] + p * a[55+i]);
  1471.         b[59+i] = (int)(q * b[59+i] + p * a[59+i]);
  1472.         b[63+i] = (int)(q * b[63+i] + p * a[63+i]);
  1473.         b[67+i] = (int)(q * b[67+i] + p * a[67+i]);
  1474.         b[71+i] = (int)(q * b[71+i] + p * a[71+i]);
  1475.         b[75+i] = (int)(q * b[75+i] + p * a[75+i]);
  1476.         b[79+i] = (int)(q * b[79+i] + p * a[79+i]);
  1477.  
  1478.         z = (int)(q*((b[35+i]&112)>>4) + p*((a[35+i]&112)>>4)) & 7;
  1479.         b[35+i] &= ~112; b[35+i] |= z << 4;
  1480.     }
  1481. }
  1482.  
  1483. SpecialRange(a, b, p)
  1484.   int a, b;
  1485.   float p;
  1486. {    register int i, z;
  1487.     int h, zz;
  1488.     register UBYTE *s = SoundData[a], *d = SoundData[b], *l;
  1489.     float fas, fad, fb = 1.0 / (b - a);
  1490.  
  1491.     for(h=a+1; h<b; h++)
  1492.     {    fad = (h - a) * fb;            /* geht so von 0.0 - 1.0 */
  1493.         fas = 1.0 - fad;            /* umgekehrt */
  1494.         l = SoundData[h];            /* zu bearbeitender Sound */
  1495.  
  1496.         if(COMMON) for(i=10; i<23; i++) switch(i)
  1497.         {    case 11:
  1498.                 z = rangeran( MIX(s[11]&3,d[11]&3) , 3, p);
  1499.                 l[11] &= ~3; l[11] |= z;
  1500.                 z = rangeran( MIX((s[11]&4)>>2,(d[11]&4)>>2) , 1, p);
  1501.                 l[11] &= ~4; l[11] |= z << 2;
  1502.                 z = rangeran( MIX((s[11]&24)>>3,(d[11]&24)>>3) , 3, p);
  1503.                 l[11] &= ~24; l[11] |= z << 3;
  1504.                 z = rangeran( MIX((s[11]&96)>>5,(d[11]&96)>>5) , 3, p);
  1505.                 l[11] &= ~96; l[11] |= z << 5;
  1506.                 break;
  1507.             case 17:
  1508.                 z = rangeran( MIX(s[17]&3,d[17]&3) , 3, p);
  1509.                 l[17] &= ~3; l[17] |= z;
  1510.                 z = rangeran( MIX((s[17]&28)>>2,(d[17]&28)>>2) , 7, p);
  1511.                 l[17] &= ~28; l[17] |= z << 2;
  1512.                 z = rangeran( MIX((s[17]&96)>>5,(d[17]&96)>>5) , 3, p);
  1513.                 l[17] &= ~96; l[17] |= z << 5;
  1514.                 break;
  1515.             case 22:
  1516.                 l[22] = s[22] & d[22];        /* Src Mute nicht sinnvoll für Ran */
  1517.                 break;
  1518.             default:
  1519.                 l[i] = rangeran( MIX(s[i],d[i]) , RangeMax[i], p);
  1520.         }
  1521.  
  1522.         if(FREQUENCY) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1523.         {    l[23+i] = rangeran( MIX(s[23+i],d[23+i]) , 100, p);
  1524.             l[83+i] = rangeran( MIX(s[83+i],d[83+i]) , 100, p);
  1525.  
  1526.             z = rangeran( MIX((s[35+i]&2)>>1,(d[35+i]&2)>>1) , 1, p);
  1527.             l[35+i] &= ~2; l[35+i] |= z << 1;
  1528.             if(z)
  1529.             {    zz = rangeran( MIX(s[27+i],d[27+i]) , 48, p);
  1530.                 while(zz > 48) zz -= 48;
  1531.                 while(zz < 0) zz += 48;
  1532.             }
  1533.             else
  1534.             {    zz = rangeran( MIX(s[27+i],d[27+i]) , 103, p);
  1535.                 while(zz > 103) zz -= 103;
  1536.                 while(zz < 0) zz += 103;
  1537.             }
  1538.             l[27+i] = zz;
  1539.  
  1540.             z = rangeran( MIX((s[35+i]&4)>>2,(d[35+i]&4)>>2) , 1, p);
  1541.             l[35+i] &= ~4; l[35+i] |= z << 2;
  1542.             z = rangeran( MIX((s[35+i]&8)>>3,(d[35+i]&8)>>3) , 1, p);
  1543.             l[35+i] &= ~8; l[35+i] |= z << 3;
  1544.         }
  1545.  
  1546.         if(WAVEFORM) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1547.         {    l[31+i] = rangeran( MIX(s[31+i],d[31+i]) , 127, p);
  1548.  
  1549.             z = rangeran( MIX(s[35+i]&1,d[35+i]&1) , 1, p);
  1550.             l[35+i] &= ~1; l[35+i] |= z;
  1551.         }
  1552.  
  1553.         if(ENVELOPE) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1554.         {    l[39+i] = rangeran( MIX(s[39+i],d[39+i]) , 100, p);
  1555.             l[43+i] = rangeran( MIX(s[43+i],d[43+i]) , 100, p);
  1556.             l[47+i] = rangeran( MIX(s[47+i],d[47+i]) , 100, p);
  1557.             l[51+i] = rangeran( MIX(s[51+i],d[51+i]) , 100, p);
  1558.             l[55+i] = rangeran( MIX(s[55+i],d[55+i]) , 100, p);
  1559.             l[59+i] = rangeran( MIX(s[59+i],d[59+i]) , 100, p);
  1560.             l[63+i] = rangeran( MIX(s[63+i],d[63+i]) , 100, p);
  1561.             l[67+i] = rangeran( MIX(s[67+i],d[67+i]) , 100, p);
  1562.             l[71+i] = rangeran( MIX(s[71+i],d[71+i]) , 100, p);
  1563.             l[75+i] = rangeran( MIX(s[75+i],d[75+i]) , 100, p);
  1564.             l[79+i] = rangeran( MIX(s[79+i],d[79+i]) , 100, p);
  1565.  
  1566.             z = rangeran( MIX((s[35+i]&112)>>4,(d[35+i]&112)>>4) , 7, p);
  1567.             l[35+i] &= ~112; l[35+i] |= z << 4;
  1568.         }
  1569.     }
  1570. }
  1571.  
  1572. SpecialCopy(a, b, p)
  1573.   UBYTE *a, *b;
  1574.   float p;
  1575. {    register int i, z;
  1576.  
  1577.     if(COMMON) for(i=10; i<23; i++) switch(i)
  1578.     {    case 11:
  1579.             z = rangeran(a[11]&3, 3, p);
  1580.             b[11] &= ~3; b[11] |= z;
  1581.             z = rangeran((a[11]&4)>>2, 1, p);
  1582.             b[11] &= ~4; b[11] |= z << 2;
  1583.             z = rangeran((a[11]&24)>>3, 3, p);
  1584.             b[11] &= ~24; b[11] |= z << 3;
  1585.             z = rangeran((a[11]&96)>>5, 3, p);
  1586.             b[11] &= ~96; b[11] |= z << 5;
  1587.             break;
  1588.         case 17:
  1589.             z = rangeran(a[17]&3, 3, p);
  1590.             b[17] &= ~3; b[17] |= z;
  1591.             z = rangeran((a[17]&28)>>2, 7, p);
  1592.             b[17] &= ~28; b[17] |= z << 2;
  1593.             z = rangeran((a[17]&96)>>5, 3, p);
  1594.             b[17] &= ~96; b[17] |= z << 5;
  1595.             break;
  1596.         case 22:
  1597.             b[22] &= a[22];            /* Src Mute nicht sinnvoll für Ran */
  1598.             break;
  1599.         default:
  1600.             b[i] = rangeran(a[i], RangeMax[i], p);
  1601.     }
  1602.     if(FREQUENCY) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1603.     {    b[23+i] = rangeran(a[23+i], 100, p);
  1604.         b[83+i] = rangeran(a[83+i], 100, p);
  1605.  
  1606.         z = rangeran((a[35+i]&2)>>1, 1, p);
  1607.         b[35+i] &= ~2; b[35+i] |= z << 1;
  1608.         if(z) b[27+i] = rangeran(a[27+i]-60, 48, p) + 60;
  1609.         else b[27+i] = rangeran(a[27+i], 103, p);
  1610.  
  1611.         z = rangeran((a[35+i]&4)>>2, 1, p);
  1612.         b[35+i] &= ~4; b[35+i] |= z << 2;
  1613.         z = rangeran((a[35+i]&8)>>3, 1, p);
  1614.         b[35+i] &= ~8; b[35+i] |= z << 3;
  1615.     }
  1616.     if(WAVEFORM) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1617.     {    b[31+i] = rangeran(a[31+i], 127, p);
  1618.  
  1619.         z = rangeran(a[35+i]&1, 1, p);
  1620.         b[35+i] &= ~1; b[35+i] |= z;
  1621.     }
  1622.     if(ENVELOPE) for(i=0; i<4; i++) if(voicemask & (1 << i))
  1623.     {    b[39+i] = rangeran(a[39+i], 100, p);
  1624.         b[43+i] = rangeran(a[43+i], 100, p);
  1625.         b[47+i] = rangeran(a[47+i], 100, p);
  1626.         b[51+i] = rangeran(a[51+i], 100, p);
  1627.         b[55+i] = rangeran(a[55+i], 100, p);
  1628.         b[59+i] = rangeran(a[59+i], 100, p);
  1629.         b[63+i] = rangeran(a[63+i], 100, p);
  1630.         b[67+i] = rangeran(a[67+i], 100, p);
  1631.         b[71+i] = rangeran(a[71+i], 100, p);
  1632.         b[75+i] = rangeran(a[75+i], 100, p);
  1633.         b[79+i] = rangeran(a[79+i], 100, p);
  1634.  
  1635.         z = rangeran((a[35+i]&112)>>4, 7, p);
  1636.         b[35+i] &= ~112; b[35+i] |= z << 4;
  1637.     }
  1638. }
  1639.  
  1640. HandleWindow(wind)
  1641.   struct Window *wind;
  1642. {    struct IntuiMessage *im;
  1643.     struct Gadget *gadgt,*g2;
  1644.     ULONG class, gadid;
  1645.     USHORT code,err;
  1646.  
  1647.     if((im = (struct IntuiMessage *)GetMsg(wind->UserPort)) == 0) return;
  1648.     class = im->Class; code = im->Code;
  1649.     if(class == GADGETUP || class == GADGETDOWN)
  1650.     {    gadgt = (struct Gadget *)im->IAddress;
  1651.         gadid = gadgt->GadgetID;
  1652.     }
  1653.     ReplyMsg(im);
  1654.  
  1655.     if(class == CLOSEWINDOW)
  1656.     {    if(wind == wspc)
  1657.         {    CloseWindow(wspc);
  1658.             wspc = NULL;
  1659.         }
  1660.         else
  1661.         {    if(UserRequest("Really terminate program?"," Oh NO!!! "," That is indeed my will. ",0))
  1662.                 shit(0);
  1663.         }
  1664.     }
  1665.  
  1666.     else if(class == MENUPICK && code != MENUNULL) HandleMenu(code);
  1667.  
  1668.     else if(class == VANILLAKEY)
  1669.     {    if((code > '0') && (code < '5'))
  1670.         {    if(envVoice != code-49)
  1671.             {    envVoice = code-49;        /* 1-4 = Envelope umschalten */
  1672.                 EnvDisplay();
  1673.             }
  1674.         }
  1675.         else switch(code)
  1676.         {    case 'c':                /* Fenster hervor! */
  1677.             case 'C':WindowToFront(wcom); break;
  1678.             case 'w':
  1679.             case 'W':WindowToFront(wwav); break;
  1680.             case 'e':
  1681.             case 'E':WindowToFront(wenv); break;
  1682.             case 'f':
  1683.             case 'F':WindowToFront(wfrq);
  1684.         }
  1685.     }
  1686.  
  1687.     else if(class == GADGETDOWN || class == GADGETUP)
  1688.     {         if(gadid < 50)        Prop2Text(wind,gadgt);
  1689.         else if(gadid < 100)    Prop2Graf(wind,gadgt);
  1690.         else if(gadid < 150)    Bool2Text(wind,gadgt);
  1691.         else if(gadid < 200)    Bool2Graf(wind,gadgt);
  1692.         else switch(gadid)
  1693.         {    case 200:
  1694.                 if(iebase)
  1695.                 {    AusGadget(wind,gadgt);        /* erst ausschalten */
  1696.                     iebase = 0;
  1697.                     AktDisplay();
  1698.                 }
  1699.                 else
  1700.                 {    iebase = 1;
  1701.                     AktDisplay();                /* erst wcom refreshen */
  1702.                     EinGadget(wind,gadgt);
  1703.                 }
  1704.                 break;
  1705.  
  1706.             case 201:
  1707.                 setmem(ACTSOUND, 10, 32);        /* mit Spaces füllen */
  1708.                 for(err = 0; Gadget2SIBuff[err] != 0; err++)
  1709.                     ACTSOUND[err] = Gadget2SIBuff[err];        /* ohne 0 kopieren */
  1710.                 break;
  1711.  
  1712.             case 202:
  1713.                 DS17 &= 31; if(Gadget10.Flags & SELECTED) DS17 |= 32;
  1714.                 break;
  1715.  
  1716.             case 203: case 204: case 205: case 206:
  1717.                 TogGadget(wind,gadgt);
  1718.                 code = 1 << (gadid-203);
  1719.                 if(gadgt->UserData==1) DS22 &= ~code; else DS22 |= code;
  1720.                 break;
  1721.  
  1722.             case 207: case 210: case 213: case 216:
  1723.                 TogGadget(wind,gadgt);
  1724.                 code = gadid-207+9;        /* PropOffset[...] */
  1725.                 g2 = FindGadget(wind,code);
  1726.                 if(gadgt->UserData == 1)
  1727.                 {    PropOffset[code] = -24;
  1728.                     ACTSOUND[27+(code-9)/3] = 84;    /* == +-0 */
  1729.                     ACTSOUND[35+(code-9)/3] |= 2;
  1730.                     ((struct PropInfo *)g2->SpecialInfo)->HorizPot = 32760;
  1731.                     ((struct PropInfo *)g2->SpecialInfo)->HorizBody = 1365;
  1732.                 }
  1733.                 else
  1734.                 {    PropOffset[code] = 0;
  1735.                     ACTSOUND[27+(code-9)/3] = 60;    /* == C3 */
  1736.                     ACTSOUND[35+(code-9)/3] &= ~2;
  1737.                     ((struct PropInfo *)g2->SpecialInfo)->HorizPot = 38160;
  1738.                     ((struct PropInfo *)g2->SpecialInfo)->HorizBody = 636;
  1739.                 }
  1740.                 RefreshGList(g2,wind,0,1);
  1741.                 Prop2Text(wind,g2);
  1742.                 break;
  1743.             
  1744.             case 234:
  1745.                 ClearMenuStrip(wspc);
  1746.                 CloseWindow(wspc);
  1747.                 wspc = NULL;
  1748.                 break;
  1749.                 
  1750.             case 235:
  1751.                 ImWorking();
  1752.                 voicemask = (VOICE4 << 3) | (VOICE3 << 2) | (VOICE2 << 1) | VOICE1;
  1753.                 switch(specialfunktion)
  1754.                 {    case 0:
  1755.                         if(SOURCE != DESTIN) SpecialExchange(SoundData[SOURCE], SoundData[DESTIN]);
  1756.                         if(AUTOWRITE)
  1757.                         {    if(err = PutSound(channel, SCARD, SOURCE & 63, SoundData[SOURCE]))
  1758.                                 SimpleRequest(WriteError[err-1]);
  1759.                             if(err = PutSound(channel, DCARD, DESTIN & 63, SoundData[DESTIN]))
  1760.                                 SimpleRequest(WriteError[err-1]);
  1761.                         }
  1762.                         break;
  1763.                     case 1:
  1764.                         if(SOURCE != DESTIN) SpecialMix(SoundData[SOURCE], SoundData[DESTIN], PERCENT);
  1765.                         if(AUTOWRITE)
  1766.                         {    if(err = PutSound(channel, DCARD, DESTIN & 63, SoundData[DESTIN]))
  1767.                                 SimpleRequest(WriteError[err-1]);
  1768.                         }
  1769.                         break;
  1770.                     case 2:
  1771.                         if(SOURCE != DESTIN) SpecialRange(MIN(SOURCE,DESTIN), MAX(SOURCE,DESTIN), PERCENT);
  1772.                         if(AUTOWRITE)
  1773.                         {    PutBlock(channel,0, 0,SoundData);            /* Einmal vollpumpen, bitte */
  1774.                             PutBlock(channel,0,32,SoundData[32]);
  1775.                             if(SCARD | DCARD)
  1776.                             {    PutBlock(channel,1, 0,SoundData[64]);    /* wenn angewählt auch die externen */
  1777.                                 PutBlock(channel,1,32,SoundData[96]);
  1778.                             }
  1779.                         }
  1780.                         break;
  1781.                     case 3:
  1782.                         SpecialCopy(SoundData[SOURCE], SoundData[DESTIN], PERCENT);
  1783.                         if(AUTOWRITE)
  1784.                         {    if(err = PutSound(channel, DCARD, DESTIN & 63, SoundData[DESTIN]))
  1785.                                 SimpleRequest(WriteError[err-1]);
  1786.                         }
  1787.                 }
  1788.                 ClearMenuStrip(wspc);
  1789.                 CloseWindow(wspc);
  1790.                 wspc = NULL;
  1791.                 AktDisplay();
  1792.                 break;
  1793.  
  1794.             case 236: case 237:            /* CARD Toggler im SpecialSetup */
  1795.                 Prop2Text(wspc, FindGadget(wspc, gadid-210));
  1796.                 break;
  1797.  
  1798.             default:
  1799.                 TogGadget(wind,gadgt);
  1800.                 code = gadid-208; gadid = code/3; code = 4 + 4*(1 - code % 3);
  1801.                 if(gadgt->UserData) ACTSOUND[35+gadid] |= code; else ACTSOUND[35+gadid] &= ~code;
  1802.         }
  1803.  
  1804.         if(AUTOWRITE && wind != wspc)
  1805.             if(err = PutSound(channel, iebase, actual, ACTSOUND))
  1806.                 SimpleRequest(WriteError[err-1]);
  1807.     }
  1808. }
  1809.  
  1810.  
  1811. /*******************************************************************/
  1812.  
  1813.  
  1814. BOOL OptionLace(argc, argv)
  1815.   int argc;
  1816.   char **argv;
  1817. {    register struct DiskObject *pdo = NULL;
  1818.     register BOOL lace = FALSE;
  1819.     register char *cp = NULL;
  1820.  
  1821.     if(argc == 0)
  1822.     {    if(IconBase = OpenLibrary("icon.library", 0L))
  1823.             if(pdo = GetDiskObject( ((struct WBStartup *)argv)->sm_ArgList->wa_Name) )
  1824.                 if(cp = FindToolType(pdo->do_ToolTypes, "LACE"))
  1825.                     if(MatchToolValue(cp, "ON")) lace = TRUE;
  1826.     }
  1827.     else if(argc==2 && *argv[1]=='L') lace = TRUE;
  1828.  
  1829.     if(IconBase) CloseLibrary(IconBase);
  1830.     if(pdo) FreeDiskObject(pdo);
  1831.     return lace;
  1832. }
  1833.  
  1834. main(argc,argv)            /* das Hauptprogramm - schön einfach, nech? */
  1835.   int argc;
  1836.   char *argv[];
  1837. {    UBYTE *msg = NULL;
  1838.     long signals;
  1839.  
  1840.     Init(OptionLace(argc, argv));
  1841.  
  1842.     while(1)
  1843.     {    signals = Wait(SWCOM | SWWAV | SWFRQ | SWENV | SWSPC | SMIDI);
  1844.  
  1845.         if(signals & SWCOM) HandleWindow(wcom);
  1846.         if(signals & SWWAV) HandleWindow(wwav);
  1847.         if(signals & SWFRQ) HandleWindow(wfrq);
  1848.         if(signals & SWENV) HandleWindow(wenv);
  1849.         if(signals & SWSPC) HandleWindow(wspc);
  1850.         if(signals & SMIDI) while(msg = GetMidiMsg(dest))
  1851.         {    if((msg[0]&~15) == MS_PROG)        /* User-Soundwechsel am Synth */
  1852.             {    actual = msg[1];
  1853.                 AktDisplay();                /* --> mitwechseln */
  1854.             }
  1855.             FreeMidiMsg(msg);
  1856.         }
  1857.     }
  1858. }                        /* klar - der Rest is ja schon konfus genug... */
  1859.